const { isCatchError, isSuccess } = require('../core/http-exception')
const logger = require('../core/logger')

const catchError = async (ctx, next) => {
  try {
    // 等待后续中间件内容结束，所以其中的错误都能捕捉到(主动抛出异常 或者 被动异常 就能到这里来)，有错误进入下面的catch中
    // 后续每个next都需要 await
    await next()
  } catch (error) {
    // error.name = 'SequelizeUniqueConstraintError'
    const _isCatchError = isCatchError(error)
    const _isSuccess = isSuccess(error)

    let log = `${error.msg}-${error.code}-${ctx.ip}`
    if (_isSuccess) {
      // 记录在成功的日志内, msg、ip、
      log += `-${JSON.stringify(error.data)}`
      logger.info(log)
    } else {
      // 记录在失败的日志内
      if (_isCatchError) {
        // 来自系统捕获的error，那么属于正常情况
        logger.info(log)
      } else {
        // 其它错误，如：代码错误
        logger.warn(log)
      }
    }
    // 响应客户端
    ctx.body = {
      msg: error.msg || '未知错误',
      code: error.errorCode || 1024,
      data: error.data,
      request: {
        methods: ctx.request.method,
        url: ctx.request.url,
      },
    }
    ctx.status = error.code || 500
  }
}

module.exports = catchError
